package com.aqie.easy.bitOperation;

/**
 * 326 判断整数是否是3的幂
 * 不用循环 或 递归
 */
public class IsPowerOfThree {
    /**
     * 1. 循环迭代 18ms
     * @param n
     * @return
     */
    public boolean isPowerOfThree(int n) {
        if (n < 1) {
            return false;
        }

        while (n % 3 == 0) {
            n /= 3;
        }
        return n == 1;
    }

    /**
     * 1. 递归  13ms
     * @param n
     * @return
     */
    public boolean isPowerOfThree1(int n) {
        if(n == 0){return false;}
        else if(n == 1){return true;}
        else
        {
            if(n%3 == 0){return isPowerOfThree1(n/3);}
            else{return false;}
        }

    }


    /**
     * 2. 基准转换 133 ms
     * @param n
     * @return
     */
    public boolean isPowerOfThree2(int n) {
        return Integer.toString(n, 3).matches("^10*$");
    }

    /**
     * 3. 运算法  90ms
     * @param n
     * @return
     */
    public boolean isPowerOfThree3(int n) {
        return (Math.log10(n) / Math.log10(3)) % 1 == 0;
        // return (Math.log(n) / Math.log(3) + epsilon) % 1 <= 2 * epsilon;
    }
    /**
     * 4, 整数限制 85ms
     * @param n
     * @return
     */
    public boolean isPowerOfThree4(int n) {
        return n > 0 && 1162261467 % n == 0;
    }


}
